/*
    关于java语言中的String类
        1、java规定，双引号括起来的字符串，是不可变的
        2、在JDK当中括起来的字符串，都是直接存储在“方法区”的“字符串常量池”当中
        3、“字符串常量池”中的元素也算是一个对象

    关于String类中的构造方法
        1、String s = new String("");
        2、String s = "";
        3、String s = new String(char数组);
        4、String s = new String(char数组，起始下标，长度);
        5、String s = new String(byte数组);
        6、String s = new String(byte数组，起始下标，长度);

 */
public class StringTest01 {
    public static void main(String[] args) {
        //这两行代码表示底层创建了3个字符串对象，都在字符串常量池当中
        String s1 = "abc";
        String s2 = "abc" + "xy";

        String s3 = new String("xy"); //对应String的内存图，此处会在堆内存开辟新对象，存储的是字符串常量池"xy"的地址

        String s4 = "HelloWorld";
        String s5 = "HelloWorld"; //对象已存在
        System.out.println( s4 == s5);  //true
        String s6 = new String("xyz");
        String s7 = new String("xyz");  //19和20行一共创建了3个对象，方法区字符串常量池1个，堆内存有2个String对象
        System.out.println( s6 == s7);  //false
        //双等号不安全，要用equals
        System.out.println(s6.equals(s7));  //true

        //构造方法
        byte[] bytes = {97 , 98 , 99};
        String s8 = new String(bytes);
        System.out.println(s8);

        String s9 = new String(bytes , 1 , 2);
        System.out.println(s9);

        char[] chars = {'我', '是' , '中' , '国' , '人'};
        String s10 = new String(chars);
        System.out.println(s10);

        String s11 = new String(chars , 2 , 3);
        System.out.println(s11);

    }
}
